#!/usr/bin/env node

console.info("args",process.argv)
const shell = require('shelljs')
const shellHelper = require('./libs/shellHelper')
const inquirer = require('inquirer');
// const spawn = require('hexo-util/lib/spawn');
// const spawn = require('child_process').spawn;
// const Promise = require('bluebird');

// const log = require('./libs/log')
// shell.echo('需要git环境')
// log()
// shell.ls('*.js').forEach(file=>console.log(file))
// console.log(shell.exec('which git12'),shell.which('git'))
// if (!shell.which('git')) {
//   shell.echo('需要git环境')
//   shell.exit(1)
// }

// shellHelper.exec('git --version').then(({stdout,stderr})=>console.log('=>>>>>>>>>>>>22323232323',stdout,stderr)).catch(err=>console.log("err================",err))

// shell.exec('git add .')
// shell.exec('git commit -m "auto commit"')
// shell.exec('git push')

// shell.echo('end')

// console.info(shellHelper.exec('chdir',{cwd:__dirname,encoding: 'utf8'}))
// shell.exec('chdir',{cwd:__dirname+'/bin',encoding: 'utf8'})

// const seriesa = shellHelper.seriesa

// function a(ctx) {
//   console.log(ctx)
//   return seriesa([
//     'git --version',
//     {cmd:'chdir',cwd:__dirname+'/bin',encoding: 'utf8'}
//   ])
// }
// a().then(()=>ask()).then(a)

// function ask(params) {
//   const promptList = [{
//     type: 'input',
//     message: '请输入文件或目录地址:',
//     name: 'dirname',
//   }]
//   return inquirer.prompt(promptList)
// }

//promise化
// shellHelper.exec('chdir',{cwd:__dirname+'/bin',encoding: 'utf8'}).then(({stdout,stderr})=>console.log(`stdout,stderr`))

// shellHelper.exec('git clone https://gitee.com/roft/gitDo.git -b t1',{stdio: 'inherit'}).then(({stdout,stderr})=>console.log('>>>>>>>>>>>>',stdout,stderr)).catch(err=>console.log("================",err))
// shellHelper.exec('git clone https://github.com/polixjs/template.git -b master',{stdio: 'inherit'}).then(({stdout,stderr})=>console.log(stdout,stderr))

// spawn('git',['clone','https://gitee.com/roft/gitDo.git'], {
// spawn('yarn', {
//     stdio: 'inherit'
// }).catch(function () {
//     return;
// }).then(function (value) {
//     console.info(value)
// })

// require('child_process').exec('ls -l | wc -l', function(err, stdout, stderr) {
//   console.log(stdout);
// });


// require('child_process').spawn('echo $NODE_ENV', {
//   shell: true,
//   stdio: 'inherit',
//   cwd: '/usr',
//   // env: {
//     // NODE_TEST: 'randal-env'
//   // }
// });

// const find = require('child_process').spawn('find', ['.', '-type', 'f']);
// const wc = require('child_process').spawn('wc', ['-l']);

// find.stdout.pipe(wc.stdin);

// wc.stdout.on('data', (data) => {
//   console.log(`Number of files ${data}`);
// });

// Listen to exit events if neither stdout and stderr exist (inherit stdio)
// stream.getCache

// let path = require('path').format({
//   dir:'/11',
//   name:'2'
// })
// console.log(path);


// let isExists = require('fs').existsSync('libs/log.js')
// console.log(isExists);
// console.log(__dirname,__filename,require('process').cwd());

// 调用exec创建子进程实例，实例上有stdout输出流、stdin输入流，通过控制输入流，监听输出流做些事情。
// 流有生命周期，可以通过监听事件处理不同阶段的需求
// stdio 标准输入输出流 standard input & output
// code 0 表示没有异常
// pipe是消费流的方式，程序可以将可读流写入到可写流中。

// 可读流：生产者
// 可写流：消费者
// pipe：生产者通向消费者的管道
// readableSrc.pipe(writableDest)
// spawn与exec的区别？  
// 默认情况下，spawn函数并不会衍生新的shell，执行通过参数传递进来的命令。由于不会创建新的shell，这是spawn函数比exec函数高效的主要原因。exec函数与spawn函数还有一点主要的区别，spawn函数通过流操作命令执行的结果，而exec函数则将程序执行的结果缓存起来，最后将缓存的结果传给回调函数中。
// spawn('ls -l')会报错而要使用spawn('ls', ['-l'])正确侧面证明了不会创建新的shell来执行命令
// 由于exec会创建子shell，所以可以直接执行shell管道命令.exec('ls -l | wc -l')

// 例子1:终端输入后利用wc命令统计 process.stdin.pipe(process.stdout)
// 可写流pipe到可写流的过程，监听data事件打印出结果

// 例子2:执行find . -type f | wc -l
// 可读流pipe到可写流的过程，监听data事件打印出结果

// 例子
// 设置stdion: 'inherit'，当执行代码时，子进程将会继承主进程的stdin、stdout和stderr。主进程的process.stdout 流将会触发子进程的事件处理函数，并在事件处理函数中立刻输出结果。

// [这篇让我掌握了流](https://segmentfault.com/a/1190000015123556)
// const { exec } = require('child_process')
// const { promisify } = require('util')
// console.log(exec[promisify.custom].toString()) // function


// const { spawn } = require('child_process');
// const ls = spawn('dir', ['shell.js']);

// ls.stdout.on('data', (data) => {
//   console.log(`stdout: ${data}`);
// });

// ls.stderr.on('data', (data) => {
//   console.error(`stderr: ${data}`);
// });

// ls.on('close', (code) => {
//   console.log(`子进程退出，退出码 ${code}`);
// });

// const ora = require('ora');
// const spinner = ora();
// spinner.start('loading');
// setTimeout(() => {
//   spinner.start('创建成功')
// }, 2000);

//execa使用例子
const execa = require('execa');
const ora = require('ora');
const { args } = require('commander');
const spinner = ora();
// (async function () {
//   try {
//     const result = await execa('yarn');
//     console.log(result);
//   } catch (error) {
//     console.log('😖:', error);
//   }
// })()
//套路
// (async function () {
//   async function a() {
//     spinner.start(`下载中`);
//     return execa('ls')
//   }
//   async function b() {
//     spinner.start(`安装中`);
//     return execa('git')
//   }
//   try {
//     (await a()).exitCode === 0 && spinner.succeed(`下载完成`);
//     (await b()).exitCode === 0 && spinner.succeed(`安装完成`)
//   } catch (error) {
//     spinner.fail();
//     console.log('😫', error);
//   }
// })()

// const Listr = requshellire('listr');
// const tasks = new Listr([
// 	{
// 		title: 'Install package dependencies with Yarn',
// 		task: (ctx, task) => execa('dir')
// 			.catch(() => {
// 				ctx.yarn = false;

// 				task.skip('Yarn not available, install it via `npm install -g yarn`');
// 			})
// 	},
// 	{
// 		title: 'Install package dependencies with npm',
// 		enabled: ctx => ctx.yarn === false,
// 		task: () => execa('ls', ['-l'])
// 	}
// ]);

// const tasks = new Listr([
// 	{
// 		title: 'Install package dependencies with Yarn',
// 		task: (ctx, task) => execa('ls')
// 			.catch(() => {
// 				ctx.yarn = false;

// 				task.title = `${task.title} (or not)`;
// 				task.skip('Yarn not available');
// 			})
// 	},
// 	{
// 		title: 'Install package dependencies with npm',
// 		skip: ctx => ctx.yarn == false && 'Dependencies already installed with Yarn',
// 		task: (ctx, task) => {
// 			task.output = 'Installing dependencies...';

// 			return execa('ls', ['-l'])
// 		}
// 	}
// ]);

// tasks.run().catch(err => {
// 	console.error(err);
// });


// let o = {a:1};
// (async function(){
//     console.info((await Promise.resolve(o)).a===1)
// })()

// concurrent:true 并行执行任务

//套路
// function a(title,ctx) {
//   console.log(ctx)
//   const tasks = new Listr([
//     {
//       title: title,
//       task: (ctx) => Promise.resolve(1)
//     }
//   ])
//   return tasks.run()
// }
// function b(params) {
//   const promptList = [{
//     type: 'input',
//     message: '请输入文件或目录地址:',
//     name: 'dirname',
//   }] 
//   return inquirer.prompt(promptList)
// }
// a('1').then(()=>b()).then(ctx=>a('2',ctx))


//exec返回值参与流程测试
const processRemote = (stdout, next) => {
  // const { stdout } = shell.exec('git remote')
  next(stdout.split(/[\n\s\r]/).filter(val => !!val))
}

const echoRemote = (stdout, next) => {
  const cmds = stdout.map(cmd => `echo ${cmd}`)
  shellHelper.series(cmds, next)
}


// shell.exec('git remote', (err, stdout) => console.log(stdout))
//四步
shellHelper.series(['echo "1\n2 3\r4"', processRemote, echoRemote, 'echo end'])
//一步
// shellHelper.series([(stdout, next) => echoRemote([1, 2], next)])
//两步
// shellHelper.series([(stdout, next) => processRemote("1\n2 3\r4", next), echoRemote, 'echo end'])
// shellHelper.series([(stdout, next) => echoRemote([1, 2], next), 'git remote'])

// next遇到异步问题，头疼！
